//#pragma comment(linker,"/STACK:16777216") /*16Mb*/
//#pragma comment(linker,"/STACK:33554432") /*32Mb*/
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<numeric>
#include<sstream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<memory>
#include<string>
#include<vector>
#include<cctype>
#include<list>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
using namespace std;

typedef unsigned long long      ui64;
typedef long long               i64;
typedef	vector<int>             VI;
typedef	vector<bool>            VB;
typedef	vector<VI>              VVI;
typedef	vector<string>          VS;
typedef	pair<int,int>           PII;
typedef map<string,int>         MSI;
typedef set<int>                SI;
typedef set<string>             SS;
typedef map<int,int>            MII;
typedef	pair<double,double>     PDD;

#define PB                      push_back
#define MP                      make_pair
#define X                       first
#define Y                       second
#define FOR(i, a, b)            for(int i = (a); i < (b); ++i)
#define RFOR(i, a, b)           for(int i = (a) - 1; i >= (b); --i)
#define CLEAR(a, b)             memset(a, b, sizeof(a))
#define SZ(a)                   int((a).size())
#define ALL(a)                  (a).begin(), (a).end()
#define RALL(a)                 (a).rbegin(), (a).rend()
#define INF                     (2000000000)


int main()
{
	int n;
	cin >> n;
	VI k(n,0);           //amount of vertexes with power of "i"
	vector<PII> r;       //edges
	vector<int> cnt(n,0);//power of vertex
	FOR(i,0,n) {
		int it = 0;
		cnt[i] = 0;
		k[cnt[i]]++;
		int j = i-1;
		while(true) {
			if(j<0) break;
			bool finish = true;
			FOR(q,0,SZ(cnt))
				if(k[q]>2)finish = false;
			if(finish) break;
			k[cnt[i]]--;
			k[cnt[j]]--;
			cnt[i]++;
			cnt[j]++;
			k[cnt[i]]++;
			k[cnt[j]]++;
			r.PB( MP(i,j) );
			j--;
		}
	}
	cout << SZ(r) << endl;
	FOR(i,0,SZ(r)) {
		printf("%d %d\n",r[i].X, r[i].Y);
	}
    return 0;
}